package medium;
import java.util.ArrayList;

/**
 * 给你一个二进制数组 nums ，你需要从中删掉一个元素。
 * 请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。
 * 如果不存在这样的子数组，请返回 0 。

 * 提示 1：
 * 输入：nums = [1,1,0,1]
 * 输出：3
 * 解释：删掉位置 2 的数后，[1,1,1] 包含 3 个 1 。

 * 示例 2：
 * 输入：nums = [0,1,1,1,0,1,1,0,1]
 * 输出：5
 * 解释：删掉位置 4 的数字后，[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 。

 * 示例 3：
 * 输入：nums = [1,1,1]
 * 输出：2
 * 解释：你必须要删除一个元素。

 * [0]输出0即可
 */
public class T4 {
    public static void main(String[] args) {
        int[] nums = {1, 1, 0, 1};
        System.out.println(new T4().longestSubarray(nums));
    }

    public int longestSubarray(int[] nums) {
        ArrayList<Integer> list = new ArrayList<>();
        int a = 0;
        for (int i = 0; i < nums.length; i++) {
            //如果到了最后一位的时候，最后一位是1则输出a+1，是0则直接输出a
            if (i == nums.length - 1) {
                if (nums[i] == 1) {
                    list.add(a + 1);
                } else {
                    list.add(a);
                }
            } else if (nums[i] == 1) {
                a++;
            } else {
                list.add(a);
                a = 0;
            }
        }
        int max = 0;
//        System.out.println(list);//用来看list里面是不是正确，连续的1的个数
        //如果nums全是1，则只会有1个数字存在list里面，如果全是0，则输出0，全是1的总数，则为数-1
        if (list.size() == 1) {
            return max = list.getFirst() == 0 ? 0 : list.getFirst() - 1;
        }
        for (int i = 0; i < list.size() - 1; i++) {
            int b = list.get(i) + list.get(i + 1);
            if (b > max) {
                max = b;
            }
        }
        return max;
    }

    // 作者：力扣官方题解
    public int longestSubarray2(int[] nums) {
        int ans = 0;
        int p0 = 0, p1 = 0;
        for (int num : nums) {
            if (num == 0) {
                p1 = p0;
                p0 = 0;
            } else {
                ++p0;
                ++p1;
            }
            ans = Math.max(ans, p1);
        }
        if (ans == nums.length) {
            --ans;
        }
        return ans;
    }


}
